import 'package:flutter/material.dart';


///
/// 使用 GlobalKey 开销较大，如果有其他可选方案，应尽量避免使用它。另外，同一个 GlobalKey 在整个 widget 树中必须是唯一的，不能重
class GetStateObjectRoute extends StatefulWidget {
  const GetStateObjectRoute({Key? key}) : super(key: key);

  @override
  State<GetStateObjectRoute> createState() => _GetStateObjectRouteState();
}
class GlobalKeyConstant{
  //定义一个globalKey, 由于GlobalKey要保持全局唯一性，我们使用静态变量存储
  static GlobalKey<ScaffoldState> _globalKey= GlobalKey();
}
class _GetStateObjectRouteState extends State<GetStateObjectRoute> {

  @override
  Widget build(BuildContext context) {
    return Scaffold(

      key: GlobalKeyConstant._globalKey , //设置key
      appBar: AppBar(
        title: Text("子树中获取State对象"),
      ),
      body: Center(
        child: Column(
          children: [
            Builder(builder: (context) {
              return ElevatedButton(
                onPressed: () {

                  ///第1种方式
                  // 查找父级最近的Scaffold对应的ScaffoldState对象
                  // ScaffoldState _state = context.findAncestorStateOfType<ScaffoldState>()!;


                  ///第2种方式
                  // 直接通过of静态方法来获取ScaffoldState
                  // 在 Flutter 开发中便有了一个默认的约定：如果 StatefulWidget 的状态是希望暴露出的，应当在 StatefulWidget 中提供一个of 静态方法来获取其 State 对象，
                  // 开发者便可直接通过该方法来获取；如果 State不希望暴露，则不提供of方法。这个约定在 Flutter SDK 里随处可见
                  ScaffoldState _state=Scaffold.of(context);
                  // 打开抽屉菜单
                  _state.openDrawer();

                  ///第3种方式
                  ///GlobalKey 是 Flutter 提供的一种在整个 App 中引用 element 的机制。
                  ///如果一个 widget 设置了GlobalKey，那么我们便可以通过globalKey.currentWidget获得该 widget 对象、
                  ///globalKey.currentElement来获得 widget 对应的element对象，如果当前 widget 是StatefulWidget，
                  ///则可以通过globalKey.currentState来获得该 widget 对应的state对象。
                  /// key: GlobalKeyConstant._globalKey , //设置key
                  // GlobalKeyConstant._globalKey.currentState!.openDrawer();

                },
                child: const Text('打开抽屉菜单1'),
              );
            }),
            Builder(builder: (context) {
              return ElevatedButton(
                onPressed: () {
                  ScaffoldMessenger.of(context).showSnackBar(
                    const SnackBar(content: Text("我是SnackBar")),
                  );
                },
                child: const Text('显示SnackBar'),
              );
            }),
          ],
        ),
      ),
      drawer: const Drawer(),
    );
  }
}